package programm;

import java.io.*;
import java.nio.channels.*;

//θα χρεισιμοποιηθεί για το κλείδωμα του προγράμματος από το να τρέχει παράλληλα, με την μέθοδο του κλειδώματος αρχείου
// ο κώδικας "αντλήθηκε" από την σελίδα http://www.java-tips.org/java-se-tips/java.lang/preventing-multiple-instances-of-an-application.html
public class Lock {

    private final String appName;
    private File file;
    private FileChannel channel;
    private FileLock lock;
    
    public Lock(String appName) {
        this.appName = appName;
     }
    
    public boolean isAppActive() {
        try {

            file = new File(System.getProperty("user.home"), appName + ".tmp");
            channel = new RandomAccessFile(file, "rw").getChannel();
            
            try {
                lock = channel.tryLock();
            } catch (OverlappingFileLockException e) {
                // already locked
                closeLock();
                return true;
            }
            
            if (lock == null) {
                closeLock();
                return true;
            }
            
            Runtime.getRuntime().addShutdownHook(new Thread() {
                // destroy the lock when the JVM is closing
                @Override
                public void run() {
                    closeLock();
                    deleteFile();
                }
            });
            return false;
        } catch (Exception e) {
            closeLock();
            return true;
        }
    }
    
    private void closeLock() {
        try { lock.release();  } catch (Exception e) {  }
        try { channel.close(); } catch (Exception e) {  }
    }
    
    private void deleteFile() {
        try { file.delete(); } catch (Exception e) { }
    }
}

